import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author Avdeychik Alexander
 */

/*
    3.6.1	bubleSorting
    Напишите консольное приложение, сортирующее последовательность чисел, заданную в файле, методом пузырька 
    Программа должна выводить на консоль данные до обработки, после каждого цикла обработки, 
        по окончании обработки (результат).
    Результаты должны сохраняться в другой файл.
*/

public class BubleSorting {
    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("2 parameters requires: source and destination files");
            return;
        }
        Scanner scan = null;
        PrintStream writer = null;
        try {
            scan = new Scanner(new FileInputStream(args[0]));
            writer = new PrintStream(new FileOutputStream(args[1]));

            ArrayList<Integer> sequence = new ArrayList<Integer>();
            while (scan.hasNext()) {
                sequence.add(scan.nextInt());
            }

            System.out.println("Bubble sorting.\n");
            System.out.println("Source sequence:");
            printList(sequence, System.out);

            bubleSort(sequence);

            System.out.println("Result sequence:");
            printList(sequence, System.out);
            printList(sequence, writer);
        } catch (FileNotFoundException e) {
            System.out.println("File [" + args[0] + "] not found\n" + e.getMessage());
        } catch (IOException e) {
            System.out.println("I/O exception during writing file [" + args[1] + "] " + e.getMessage());
        } finally {
            if (scan != null) {
                scan.close();
            }
            if (writer != null) {
                writer.close();
            }
        }
    }

    private static void bubleSort(List<Integer> list) throws IOException {
        for (int i = list.size() - 1; i >= 0; i--) {
            for (int j = 0; j < i; j++) {
                if (list.get(j) > list.get(j + 1)) {
                    swap(list, j, j + 1);
                }
            }
            printList(list, System.out);
        }
    }

    private static void swap(List<Integer> list, int i, int j) {
        Integer tmp = list.get(i);
        list.set(i, list.get(j));
        list.set(j, tmp);
    }

    private static void printList(List<Integer> list, PrintStream printStream) throws IOException {
        for (Integer integer : list) {
            printStream.print(integer + "\t");
        }
        printStream.println();
    }
}
